@echo off
setlocal enableextensions
REM 强制显示所有输出，便于调试
echo ========================================
echo 教学FTP服务器启动脚本 - 调试版本
echo ========================================
echo.

REM 设置代码页为中文
chcp 936 >nul 2>&1
if %ERRORLEVEL% NEQ 0 (
    echo [WARN] 无法设置中文代码页，可能出现乱码
)

REM 项目根目录
set "BASE_DIR=%~dp0"
echo [INFO] 项目根目录: %BASE_DIR%
cd /d "%BASE_DIR%"
if %ERRORLEVEL% NEQ 0 (
    echo [ERROR] 无法切换到项目目录: %BASE_DIR%
    pause
    exit /b 1
)

REM 检查基本文件是否存在
echo [INFO] 检查项目文件...
if not exist "main.py" (
    echo [ERROR] 缺少 main.py 文件，请确认在正确的项目目录中运行
    pause
    exit /b 1
)
if not exist "requirements.txt" (
    echo [ERROR] 缺少 requirements.txt 文件
    pause
    exit /b 1
)
echo [INFO] 项目文件检查通过

REM 路径与日志
set "LOG_DIR=%BASE_DIR%logs"
if not exist "%LOG_DIR%" (
    echo [INFO] 创建日志目录: %LOG_DIR%
    mkdir "%LOG_DIR%"
)

REM 管理后台监听地址与端口
set "APP_HOST=0.0.0.0"
set "APP_PORT=8000"
echo [INFO] 管理后台将监听: %APP_HOST%:%APP_PORT%

REM Python 与依赖路径
set "VENV_PY=%BASE_DIR%env\Scripts\python.exe"
set "VENV_PIP=%BASE_DIR%env\Scripts\pip.exe"
set "EMBED_DIR=%BASE_DIR%python_embed"
set "EMBED_EXE=%EMBED_DIR%\python.exe"
set "EMBED_ZIP=%BASE_DIR%python_embed.zip"

set "PY_EXE="
set "PIP_EXE="

echo [INFO] 检查 Python 环境...

REM 1) 首选：仓库自带 venv 可用
echo [INFO] 检查仓库内虚拟环境...
if exist "%VENV_PY%" (
    echo [INFO] 找到虚拟环境 Python: %VENV_PY%
    "%VENV_PY%" --version >nul 2>&1
    if %ERRORLEVEL% EQU 0 (
        echo [INFO] 虚拟环境 Python 可用
        set "PY_EXE=%VENV_PY%"
        set "PIP_EXE=%VENV_PIP%"
    ) else (
        echo [WARN] 虚拟环境 Python 无法运行
    )
) else (
    echo [INFO] 未找到虚拟环境 Python
)

REM 2) 其次：嵌入式 Python
if "%PY_EXE%"=="" (
    echo [INFO] 检查嵌入式 Python...
    if not exist "%EMBED_EXE%" (
        if exist "%EMBED_ZIP%" (
            echo [INFO] 找到嵌入式 Python 压缩包，正在解压...
            echo [INFO] 源文件: %EMBED_ZIP%
            echo [INFO] 目标目录: %EMBED_DIR%
            
            REM 检查 PowerShell 是否可用
            powershell -nologo -noprofile -command "Write-Host 'PowerShell 可用'" >nul 2>&1
            if %ERRORLEVEL% NEQ 0 (
                echo [ERROR] PowerShell 不可用，无法解压嵌入式 Python
                goto :TRY_SYSTEM_PY
            )
            
            powershell -nologo -noprofile -command "Try { Expand-Archive -Path '%EMBED_ZIP%' -DestinationPath '%EMBED_DIR%' -Force; Write-Host '[INFO] 解压成功' } Catch { Write-Host '[ERROR] 解压失败:' $_.Exception.Message; Exit 1 }"
            if %ERRORLEVEL% NEQ 0 (
                echo [ERROR] 解压嵌入式 Python 失败
                goto :TRY_SYSTEM_PY
            )
        ) else (
            echo [INFO] 未找到嵌入式 Python 压缩包: %EMBED_ZIP%
            goto :TRY_SYSTEM_PY
        )
    ) else (
        echo [INFO] 找到已解压的嵌入式 Python: %EMBED_EXE%
    )
    
    if exist "%EMBED_EXE%" (
        echo [INFO] 配置嵌入式 Python 环境
        set "PY_EXE=%EMBED_EXE%"
        set "PIP_EXE="
        set "PYTHONHOME=%EMBED_DIR%"
        set "PYTHONPATH=%BASE_DIR%env\Lib\site-packages;%BASE_DIR%"
        
        REM 修正 _pth 文件
        echo [INFO] 修正 Python 路径配置...
        set "PTH_FILE="
        for /f "delims=" %%F in ('dir /b "%EMBED_DIR%\python3*._pth" 2^>nul') do (
            set "PTH_FILE=%EMBED_DIR%\%%~F"
            goto :PTH_DONE
        )
        :PTH_DONE
        if not "%PTH_FILE%"=="" (
            echo [INFO] 找到路径配置文件: %PTH_FILE%
            findstr /C:"import site" "%PTH_FILE%" >nul 2>&1 || (
                echo [INFO] 添加 'import site' 到路径配置
                echo import site>>"%PTH_FILE%"
            )
            findstr /R "^\.$" "%PTH_FILE%" >nul 2>&1 || (
                echo [INFO] 添加当前目录到路径配置
                echo .>>"%PTH_FILE%"
            )
        ) else (
            echo [WARN] 未找到 Python 路径配置文件
        )
    )
)

REM 3) 兜底：系统 Python
:TRY_SYSTEM_PY
if "%PY_EXE%"=="" (
    echo [INFO] 尝试使用系统 Python 创建虚拟环境...
    
    REM 检查 py 启动器
    where py >nul 2>&1
    if %ERRORLEVEL% EQU 0 (
        echo [INFO] 找到 Python 启动器，创建虚拟环境...
        py -3 --version >nul 2>&1
        if %ERRORLEVEL% EQU 0 (
            py -3 -m venv env
            if %ERRORLEVEL% EQU 0 (
                echo [INFO] 虚拟环境创建成功
                set "PY_EXE=%BASE_DIR%env\Scripts\python.exe"
                set "PIP_EXE=%BASE_DIR%env\Scripts\pip.exe"
            ) else (
                echo [ERROR] 虚拟环境创建失败
            )
        ) else (
            echo [ERROR] Python 启动器无法运行 Python 3
        )
    ) else (
        echo [INFO] 未找到 Python 启动器，尝试直接使用 python 命令...
        where python >nul 2>&1
        if %ERRORLEVEL% EQU 0 (
            python --version >nul 2>&1
            if %ERRORLEVEL% EQU 0 (
                python -m venv env
                if %ERRORLEVEL% EQU 0 (
                    echo [INFO] 虚拟环境创建成功
                    set "PY_EXE=%BASE_DIR%env\Scripts\python.exe"
                    set "PIP_EXE=%BASE_DIR%env\Scripts\pip.exe"
                ) else (
                    echo [ERROR] 虚拟环境创建失败
                )
            ) else (
                echo [ERROR] python 命令无法运行
            )
        ) else (
            echo [ERROR] 未找到 python 命令
        )
    )
)

REM 最终检查
if "%PY_EXE%"=="" (
    echo.
    echo [ERROR] ========================================
    echo [ERROR] 无法找到可用的 Python 环境！
    echo [ERROR] ========================================
    echo [ERROR] 请确保以下任一条件满足：
    echo [ERROR] 1. 项目包含完整的 env\ 虚拟环境目录
    echo [ERROR] 2. 项目包含 python_embed.zip 嵌入式 Python
    echo [ERROR] 3. 系统已安装 Python 3.10+ 并可通过 py 或 python 命令访问
    echo.
    echo [INFO] 系统信息：
    echo [INFO] Windows 版本: 
    ver
    echo [INFO] 当前用户: %USERNAME%
    echo [INFO] 当前目录: %CD%
    echo.
    pause
    exit /b 1
)

echo [INFO] 使用 Python: %PY_EXE%

REM 测试 Python 是否可用
echo [INFO] 测试 Python 环境...
"%PY_EXE%" -c "print('Python 环境正常')" 2>nul
if %ERRORLEVEL% NEQ 0 (
    echo [ERROR] Python 环境测试失败
    echo [ERROR] 尝试运行: "%PY_EXE%" -c "print('test')"
    "%PY_EXE%" -c "print('test')"
    pause
    exit /b 1
)

REM 依赖检查
echo [INFO] 检查依赖包...
"%PY_EXE%" -c "import uvicorn; print('uvicorn 可用')" >nul 2>&1
if %ERRORLEVEL% NEQ 0 (
    echo [WARN] uvicorn 不可用，尝试安装依赖...
    if not "%PIP_EXE%"=="" (
        echo [INFO] 安装依赖包...
        "%PY_EXE%" -m pip install -r requirements.txt
        if %ERRORLEVEL% NEQ 0 (
            echo [ERROR] 依赖安装失败
            pause
            exit /b 1
        )
    ) else (
        echo [ERROR] 无 pip 可用且缺少 uvicorn，请手动安装依赖
        pause
        exit /b 1
    )
)

REM 端口占用检测
echo [INFO] 检查端口占用...
netstat -ano | findstr ":%APP_PORT%" | findstr LISTENING >nul 2>&1
if not errorlevel 1 (
    echo [ERROR] 端口 %APP_PORT% 已被占用
    echo [INFO] 占用端口的进程：
    netstat -ano | findstr ":%APP_PORT%" | findstr LISTENING
    echo [INFO] 请关闭占用进程或修改 start.bat 中的 APP_PORT
    pause
    exit /b 1
)

echo [INFO] 启动管理后台...
echo [INFO] 访问地址: http://127.0.0.1:%APP_PORT%/
echo [INFO] 日志文件: %LOG_DIR%\server.log

REM 启动服务器
start "" cmd /c "\"%PY_EXE%\" -m uvicorn main:app --host %APP_HOST% --port %APP_PORT% >\"%LOG_DIR%\server.log\" 2>&1"

REM 等待服务启动
echo [INFO] 等待服务启动...
powershell -nologo -noprofile -command "for ($i=0;$i -lt 40;$i++) { try { Invoke-WebRequest -Uri ('http://127.0.0.1:%APP_PORT%/') -UseBasicParsing -TimeoutSec 2 | Out-Null; Write-Host '[INFO] 服务启动成功'; exit 0 } catch {}; Start-Sleep -Milliseconds 500 }; Write-Host '[ERROR] 服务启动超时'; exit 1"
if %ERRORLEVEL% NEQ 0 (
    echo [ERROR] 管理后台启动失败或超时
    echo [ERROR] 请查看日志文件: %LOG_DIR%\server.log
    echo [INFO] 按任意键查看日志内容...
    pause >nul
    if exist "%LOG_DIR%\server.log" (
        type "%LOG_DIR%\server.log"
    ) else (
        echo [ERROR] 日志文件不存在
    )
    pause
    exit /b 1
)

REM 自动启动 FTP 服务
echo [INFO] 自动启动 FTP 服务...
powershell -nologo -noprofile -command "try { $p=%APP_PORT%; $u='http://127.0.0.1:'+ $p + '/api/server/start'; $body=@{host='0.0.0.0';port=2121} | ConvertTo-Json; Invoke-RestMethod -Method Post -Uri $u -ContentType 'application/json' -Body $body | Out-Null; Write-Host '[INFO] FTP 服务启动成功'; exit 0 } catch { Write-Host '[WARN] FTP 服务启动失败，请在管理页面手动启动'; exit 1 }"

echo.
echo ========================================
echo [SUCCESS] 启动完成！
echo ========================================
echo [INFO] 管理后台: http://127.0.0.1:%APP_PORT%/
echo [INFO] 日志文件: %LOG_DIR%\server.log
echo [INFO] 按任意键打开管理页面...
pause >nul

start "" "http://127.0.0.1:%APP_PORT%/"

echo [INFO] 脚本执行完成，按任意键退出...
pause >nul